package com.woniuxy.service.impl;

import com.woniuxy.dao.RbacRoleMenuDao;
import com.woniuxy.entity.RbacMenu;
import com.woniuxy.dao.RbacMenuDao;
import com.woniuxy.service.RbacMenuService;
import com.woniuxy.service.RbacRoleMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * (RbacMenu)表服务实现类
 *
 * @author makejava
 * @since 2021-04-28 22:16:12
 */
@Service("rbacMenuService")
public class RbacMenuServiceImpl implements RbacMenuService {
    @Resource
    private RbacMenuDao rbacMenuDao;
    @Autowired(required = false)
    RbacRoleMenuDao rbacRoleMenuDao;
    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public RbacMenu queryById(int id) {
        return this.rbacMenuDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<RbacMenu> queryAllByLimit(int offset, int limit) {
        return this.rbacMenuDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param rbacMenu 实例对象
     * @return 实例对象
     */
    @Override
    public RbacMenu insert(RbacMenu rbacMenu) {
        this.rbacMenuDao.insert(rbacMenu);
        return rbacMenu;
    }

    /**
     * 修改数据
     *
     * @param rbacMenu 实例对象
     * @return 实例对象
     */
    @Override
    public RbacMenu update(RbacMenu rbacMenu) {
        this.rbacMenuDao.update(rbacMenu);
        return this.queryById(rbacMenu.getId());
    }

    /**
     * 通过主键删除数据
     * @return 是否成功
     */
    @Override
    public boolean deleteById(int id) {
        return this.rbacMenuDao.deleteById(id) > 0;
    }

    @Override
    public List<RbacMenu> findAllMenu() {
        return  this.rbacMenuDao.findTopMenu();
    }

    @Override
    public List<RbacMenu> findLeftMenu(int id) {
        //查询出所有菜单数据
        List<RbacMenu> allMenu = this.rbacMenuDao.findTopMenu();
        //查询出当前角色所有的菜单id
        List<Integer> roleMenuNum = rbacRoleMenuDao.findOneRole(id);
        //最后返回的菜单列表
        List<RbacMenu> myMenu = new ArrayList<>();

        //第一级菜单 第二级菜单 这里就不用迭代多级菜单了 2级就够了
        for (RbacMenu first : allMenu) {
            //每一级菜单创建一个实体类
            RbacMenu rbacMenu = first;
            //清空新实体类一级菜单下的所有子菜单
            //遍历二级菜单
            Iterator<RbacMenu> iterator = first.getMenus().iterator();
            while (iterator.hasNext()) {
                //循环判断是否包含菜单id
                if (!roleMenuNum.contains(iterator.next().getId())){
                    iterator.remove();
                }
            }
            //每次都放入1级菜单  无所谓你2级菜单下有么有数据
            myMenu.add(rbacMenu);
        }
        return myMenu;
    }
}
